feat: add pushedAt field (R5/R13) — pipe GitHub pushed_at through all…#21
Conversation
… layers - V18 migration: add pushed_at_gh TIMESTAMPTZ column to repos - Expose pushedAt in RepoResponse (distinct from updatedAt/metadata change) - Persist in GitHubSearchClient ingest, upsertMetadataOnly, and Meili sync - Map in RepoRepository, SearchRepository, MeiliRepoHit, all route mappers - Add POST /internal/backfill-pushed-at to fill NULL rows on existing data Co-Authored-By: Oz <oz-agent@warp.dev>
Gone and Archived branches in runBackfill never wrote pushed_at_gh, so those rows kept appearing in the pushed_at_gh IS NULL filter on every subsequent invocation. Fix: call markPushedAtFallback() for both cases, which stamps COALESCE(updated_at_gh, indexed_at) as a proxy so they are never reconsidered. TransientFailure is intentionally left NULL to be retried. Update endpoint comment to accurately describe termination semantics per outcome branch. Co-Authored-By: Oz <oz-agent@warp.dev>
…cal codes TopicCodeMapper resolves raw GitHub topic strings to canonical codes (ai, privacy, security, networking, messaging, browser, social, launcher, notes, reader, audio, video, photo, backup, self-hosted). Derived at response-construction time from existing topics field — no DB migration, no Meili change. All 5 RepoResponse mappers updated. Frontend can render up to 3 codes as TopicGlyph icons. Replaces the current hardcoded 12-glyph set + alias map with backend-driven normalization covering the actual FOSS app taxonomy in the catalog. Co-Authored-By: Oz <oz-agent@warp.dev>
|
Warning Rate limit exceeded
You’ve run out of usage credits. Purchase more in the billing tab. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (7)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Greptile SummaryThis PR pipes GitHub's
Confidence Score: 3/5Not ready to merge without confirming the Python The Kotlin-side wiring is well-structured and follows existing patterns, but the nightly Python
Important Files Changed
Sequence DiagramsequenceDiagram
participant GH as GitHub API
participant GSC as GitHubSearchClient
participant PG as Postgres (repos)
participant Meili as Meilisearch
participant SR as SearchRepository
participant MeiliSync as meili_sync.py (Python)
Note over GSC,PG: On-demand ingest path
GH->>GSC: pushed_at (ISO-8601)
GSC->>PG: upsert pushed_at_gh (OffsetDateTime)
GSC->>Meili: "addDocuments (pushed_at = raw string)"
Note over SR,PG: Postgres search path
SR->>PG: SELECT pushed_at_gh
PG-->>SR: JDBC string format
Note over Meili: Meilisearch search path
Meili-->>SearchRoutes: pushed_at (ISO-8601 string)
Note over MeiliSync,Meili: Python sync (nightly)
MeiliSync->>Meili: POST /documents (no pushed_at field)
Meili-->>Meili: pushed_at wiped from all docs
Note over InternalRoutes,PG: /backfill-pushed-at
InternalRoutes->>PG: SELECT WHERE pushed_at_gh IS NULL
InternalRoutes->>GH: refreshRepo(fullName)
GH-->>InternalRoutes: Ok / Gone / Archived / TransientFailure
InternalRoutes->>PG: UPDATE pushed_at_gh (real or fallback)
|
| return PRIORITY_ORDER.filter { code -> | ||
| MAPPINGS.getValue(code).any { it in lower } | ||
| } |
There was a problem hiding this comment.
MAPPINGS.getValue(code) throws NoSuchElementException at runtime if a code appears in PRIORITY_ORDER but not in MAPPINGS. Currently both lists are in sync, but the failure mode is silent corruption of all topicCodes responses rather than a compile-time or unit-test error. Using get with a null check makes the contract more resilient to future edits.
| return PRIORITY_ORDER.filter { code -> | |
| MAPPINGS.getValue(code).any { it in lower } | |
| } | |
| return PRIORITY_ORDER.filter { code -> | |
| MAPPINGS[code]?.any { it in lower } == true | |
| } |
… layers